package cn.jinbyte.web.model;

import cn.hutool.http.useragent.UserAgent;
import cn.jinbyte.web.model.AccessUser;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;

import java.time.Duration;
import java.time.Instant;
import java.util.Map;

/**
 * 日志记录信息
 *
 * @author jinty
 */
@Builder
@Data
@Accessors(fluent = true)
public class LogRecord {
    /**
     * 时间戳
     */
    private final Instant timestamp;

    /**
     * 模块
     */
    private String module;

    /**
     * 业务域
     */
    private String domain;

    /**
     * 描述
     */
    private String description;

    /**
     * 访问用户
     */
    private AccessUser accessUser;

    /**
     * 请求信息
     */
    private LogRequest request;

    /**
     * 响应信息
     */
    private LogResponse response;

    /**
     * 错误信息
     */
    private String errorMsg;

    /**
     * 耗时
     */
    private Duration timeTaken;

    /**
     * 请求信息
     */
    @Data
    @Builder
    public static class LogRequest {

        /**
         * 请求方式
         */
        private String method;

        /**
         * 请求 URI
         */
        private String uri;

        /**
         * IP
         */
        private String ip;
        /**
         * IP 归属地
         */
        private String address;

        /**
         * 请求头
         */
        private Map<String, String> headers;

        /**
         * 请求体（JSON 字符串）
         */
        private String body;

        /**
         * 请求参数
         */
        private Map<String, String> param;

        /**
         * 用户代理
         */
        private UserAgent userAgent;
    }

    /**
     * 响应信息
     */
    @Data
    @Builder
    public static class LogResponse {
        /**
         * 状态码
         */
        private Integer status;

        /**
         * 响应头
         */
        private Map<String, String> headers;

        /**
         * 响应体（JSON 字符串）
         */
        private String body;

        /**
         * 响应参数
         */
        private Map<String, Object> param;
    }
}
